package com.yic.module.wms.dal.mysql.itemwarehouseinfo;

import java.math.BigDecimal;
import java.util.*;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.yic.framework.common.pojo.PageResult;
import com.yic.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.yic.framework.mybatis.core.mapper.BaseMapperX;
import com.yic.module.wms.dal.dataobject.itemwarehouseinfo.ItemWarehouseInfoDO;
import org.apache.ibatis.annotations.Mapper;
import com.yic.module.wms.controller.admin.itemwarehouseinfo.vo.*;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;

/**
 * 库存明细 Mapper
 *
 * @author 系统管理员
 */
@Mapper
public interface ItemWarehouseInfoMapper extends BaseMapperX<ItemWarehouseInfoDO> {

    default PageResult<ItemWarehouseInfoDO> selectPage(ItemWarehouseInfoPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<ItemWarehouseInfoDO>()
                .eqIfPresent(ItemWarehouseInfoDO::getFactoryId, reqVO.getFactoryId())
                .eqIfPresent(ItemWarehouseInfoDO::getWarehouseId, reqVO.getWarehouseId())
                .eqIfPresent(ItemWarehouseInfoDO::getAreaId, reqVO.getAreaId())
                .eqIfPresent(ItemWarehouseInfoDO::getLocationId, reqVO.getLocationId())
                .eqIfPresent(ItemWarehouseInfoDO::getItemId, reqVO.getItemId())
                .eqIfPresent(ItemWarehouseInfoDO::getItemWarehouseId, reqVO.getItemWarehouseId())
                .eqIfPresent(ItemWarehouseInfoDO::getBatchNo, reqVO.getBatchNo())
                .eqIfPresent(ItemWarehouseInfoDO::getSerialNo, reqVO.getSerialNo())
                .orderByDesc(ItemWarehouseInfoDO::getId));
    }

    default List<ItemWarehouseInfoDO> selectList(ItemWarehouseInfoExportReqVO reqVO) {
        return selectList(new LambdaQueryWrapperX<ItemWarehouseInfoDO>()
                .eqIfPresent(ItemWarehouseInfoDO::getFactoryId, reqVO.getFactoryId())
                .eqIfPresent(ItemWarehouseInfoDO::getWarehouseId, reqVO.getWarehouseId())
                .eqIfPresent(ItemWarehouseInfoDO::getAreaId, reqVO.getAreaId())
                .eqIfPresent(ItemWarehouseInfoDO::getLocationId, reqVO.getLocationId())
                .eqIfPresent(ItemWarehouseInfoDO::getItemId, reqVO.getItemId())
                .eqIfPresent(ItemWarehouseInfoDO::getItemWarehouseId, reqVO.getItemWarehouseId())
                .eqIfPresent(ItemWarehouseInfoDO::getBatchNo, reqVO.getBatchNo())
                .eqIfPresent(ItemWarehouseInfoDO::getSerialNo, reqVO.getSerialNo())
                .orderByDesc(ItemWarehouseInfoDO::getId));
    }

    default List<ItemWarehouseInfoDO> selectList(Long itemWarehouseId) {
        return selectList(new LambdaQueryWrapperX<ItemWarehouseInfoDO>()
                .eqIfPresent(ItemWarehouseInfoDO::getItemWarehouseId, itemWarehouseId));
    }

    default List<ItemWarehouseInfoDO> selectList(Long warehouseId, Long areaId, Long locationId, Long itemWarehouseId) {
        return selectList(new LambdaQueryWrapperX<ItemWarehouseInfoDO>()
                .eq(ItemWarehouseInfoDO::getWarehouseId, warehouseId)
                .eq(ItemWarehouseInfoDO::getAreaId, areaId)
                .eq(ItemWarehouseInfoDO::getLocationId, locationId)
                .eq(ItemWarehouseInfoDO::getItemWarehouseId, itemWarehouseId));
    }

    @Update("update wms_item_warehouse_info set stock = stock + #{negate} where id = #{id}")
    int updateStock(@Param("id") Long id, @Param("negate") BigDecimal negate);

    default ItemWarehouseInfoDO selectBySourceId(Long sourceId, Integer type) {
        return selectOne(new LambdaQueryWrapperX<ItemWarehouseInfoDO>()
                .eq(ItemWarehouseInfoDO::getSourceId, sourceId)
                .eq(ItemWarehouseInfoDO::getType, type));
    }
}
